/*
 * @(#)BaseServer.java MinaNetSocket 2016年12月16日
 * Copyright (c) 2010-2020 Easy ITS, Inc. All rights reserved.
 */
package zhanglu.family.socket.textline.server;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * 实例化服务端的管理类
 * 
 * @author zhanglu
 * @date 2016年12月16日
 */
public class BaseTCPServer {

    private Integer bufferSize; // 接收缓存区字节

    private Integer idleTime;  // 连接超时时间,秒，默认60秒

    private Integer port;      // 服务端口

    private String  charset;   // 编码格式

    /**
     * 实例化服务
     * 默认是缓冲区大小2048字节、超时连接60秒、编码UTF-8，可以调用set方法重新设置
     * 
     * @param port
     *            服务端口
     */
    public BaseTCPServer(Integer port) {
        this.port = port;
        this.bufferSize = 2048;
        this.idleTime = 60;
        this.charset = "UTF-8";
    }

    /**
     * 设置缓冲区大小，字节
     * 
     * @param bufferSize
     *            字节
     */
    public void setBufferSize(int bufferSize) {
        this.bufferSize = bufferSize;
    }

    /**
     * 设置超时时间
     * 
     * @param idleTime
     *            超时时间（秒）
     */
    public void setIdleTime(int idleTime) {
        this.idleTime = idleTime;
    }

    /**
     * 设置编码格式
     * 
     * @param charset
     *            编码格式
     */
    public void setCharset(String charset) {
        this.charset = charset;
    }

    /**
     * 启动服务
     * 
     * @param handlerAction
     *            业务处理类
     * @return
     */
    public boolean startServer(IoHandlerAdapter handlerAction) {
        // 服务器端的主要对象
        NioSocketAcceptor acceptor = new NioSocketAcceptor();
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

        // 设置Filter链
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());

        // 设置消息处理类（创建、关闭Session，可读可写等等，继承自接口IoHandler）
        acceptor.setHandler(handlerAction);
        // 设置接收缓存区大小
        acceptor.getSessionConfig().setReadBufferSize(this.bufferSize);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, this.idleTime);
        chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName(this.charset))));

        try {
            // 服务器开始监听
            acceptor.bind(new InetSocketAddress(this.port));
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
